%% @author diana
%% @doc @todo Add description to maxteilsummeR.


-module(maxteilsummeR).

%% ====================================================================
%% API functions
%% ====================================================================
-export([linkesRandMax/1, rechtesRandMax/1, maxTeilsummeRekursiv/1, zeitmessung/1]).



%% ====================================================================
%% Internal functions
%% ====================================================================

deleteLast(L) -> lists:sublist(L,length(L)-1).

linkesRandMax(L) -> linkesRandMax(L, 0, 0).
linkesRandMax([], BischerMax, _) -> BischerMax;
linkesRandMax(L, BischerMax, BischerSum) -> case lists:sum(L) > BischerMax of
							  true -> linkesRandMax(deleteLast(L), lists:sum(L), BischerSum + lists:sum(L));
				     		  false -> linkesRandMax(deleteLast(L), BischerMax, BischerSum + lists:sum(L)) end.
	
rechtesRandMax([H|T]) -> rechtesRandMax([H|T], 0, 0).
rechtesRandMax([], BischerMax1, _) -> BischerMax1;
rechtesRandMax([H|T], BischerMax1, BischerSum1) -> case lists:sum([H|T]) > BischerMax1 of
							  true -> rechtesRandMax(T, lists:sum([H|T]), BischerSum1 + lists:sum([H|T]));
				     		  false -> rechtesRandMax(T, BischerMax1, BischerSum1 + lists:sum([H|T])) end.

maxTeilsummeRekursiv([]) -> 0;
maxTeilsummeRekursiv([Elem]) -> max(Elem,0);
maxTeilsummeRekursiv(L) -> tuple_to_list(lists:split(round(length(L)/2), L)).
							%maxTeilsummeRekursiv(L, tuple_to_list(lists:split(round(length(L)/2), L))).
maxTeilsummeRekursiv(_, [H|T]) -> max(maxTeilsummeRekursiv(lists:flatten(T)), max(maxTeilsummeRekursiv(H),
								rechtesRandMax(H) + linkesRandMax(lists:flatten(T)))).

%% Zeitmessung
zeitmessung(File) -> timer:tc(maxteilsummeR,maxTeilsummeRekursiv,
							  [read_file:fileIntoIntlist(read_file:fileToString(File))]).

